package com.boonya.jorm.dao;

import java.util.List;
import org.javaclub.jorm.Page;
import org.javaclub.jorm.Session;
import org.javaclub.jorm.jdbc.JdbcException;
import org.javaclub.jorm.jdbc.batch.JdbcBatcher;
import org.javaclub.jorm.jdbc.criterion.Order;
import org.javaclub.jorm.jdbc.sql.SqlParams;
import com.boonya.jorm.entity.User;
import com.boonya.jorm.service.utils.LogManager;
import com.boonya.jorm.service.utils.SessionManager;
/**
 * 
 * <li>文件名称: UserDao</li>
 * <li>文件描述: $</li>
 * <li>内容摘要: 包括模块、函数及其功能的说明</li>
 * <li>完成日期：2013-10-27</li>
 * <li>所属作者：boonyachengdu@gmail.com</li>
 * <li>修改记录1：下午04:52:16,修改内容描述</li>
 *
 */
public class UserDao
{

	/**
	 * 根据ID查询用户信息
	 * 
	 * @param id
	 *            主键ID
	 * @return User 用户信息对象
	 */
	public User getUserById(int id)
	{
		Session session = SessionManager.getInstance();
		User user = session.read(User.class, id);
		return user;
	}

	/**
	 * 用户信息入库
	 * 
	 * @param user
	 *            用户信息对象
	 * @return boolean 成功(true)/失败(false)
	 */
	public boolean saveUser(User user)
	{
		Session session = SessionManager.getInstance();
		// 清空User实体对应的数据库表的记录
		session.clean(User.class);
		try
		{
			session.save(user);
			return true;
		} catch (JdbcException e)
		{
			LogManager.setLog("用户信息入库失败", e);
		}
		return false;
	}

	/**
	 * 根据用户ID删除用户
	 * 
	 * @param id
	 *            用户ID
	 */
	public boolean deleteUser(int id)
	{
		Session session = SessionManager.getInstance();
		User user = session.read(User.class, id);
		try
		{
			if (user != null)
			{
				session.delete(user);
				return true;
			}
		} catch (JdbcException e)
		{
			LogManager.setLog("根据用户ID删除用户失败", e);
		}
		return false;
	}

	/**
	 * 用户信息更新
	 * 
	 * @param user
	 *            用户信息对象
	 * @return boolean 成功(true)/失败(false)
	 */
	public boolean updateUser(User user)
	{
		Session session = SessionManager.getInstance();
		try
		{
			session.update(user);
			return true;
		} catch (JdbcException e)
		{
			LogManager.setLog("用户信息更新失败", e);
		}
		return false;
	}

	/**
	 * [批量入库]用户信息
	 * 
	 * @param userList
	 *            用户列表
	 * @return boolean 成功(true)/失败(false)
	 */
	public boolean batchSaveUser(List<User> userList)
	{
		Session session = SessionManager.getInstance();
		// 清空User实体对应的数据库表的记录
		session.clean(User.class);
		JdbcBatcher batcher = session.createBatcher();
		try
		{
			User user = null;
			for (int i = 0, j = userList.size(); i < j; i++)
			{
				user = userList.get(i);
				if (user != null)
				{
					batcher.save(user);
				}
			}
			batcher.execute();
			return true;
		} catch (JdbcException e)
		{
			LogManager.setLog("[批量入库]用户信息失败", e);
		}
		return false;
	}

	/**
	 * 用户分页查询(条件查询)
	 * 
	 * @param page
	 *            分页索引
	 * @param pageSize
	 *            每页条数
	 * @param sortType
	 *            排序类型
	 * @param sortName
	 *            排序字段
	 * @return List<User> 用户分页列表
	 */
	@SuppressWarnings(
	{ "rawtypes", "unchecked" })
	public List<User> getUserPage(Object[] params, int page, int pageSize, String sortType, String sortName)
	{
		Session session = SessionManager.getInstance();
		String sql = " select * from t_user where name = ? and id > ? ";
		SqlParams sqlParams = new SqlParams(sql, params);
		sqlParams.setObjectClass(User.class);
		// 设置查询条件
		// sqlParams.setParams(params);
		// sqlParams.setSql(sql);
		// 设置分页的查询索引
		int firstPageIndex = (page - 1) * pageSize;
		int maxPageIndex = page * pageSize;
		sqlParams.setFirstResult(firstPageIndex);
		sqlParams.setMaxResults(maxPageIndex);
		sqlParams.addOrder(sortType.equals("asc") ? Order.asc(sortName) : Order.desc(sortName));

		List<User> users = session.list(sqlParams);
		return users;
	}

	/**
	 * 用户分页查询
	 * 
	 * @param page
	 *            分页索引
	 * @param pageSize
	 *            每页条数
	 * @param sortType
	 *            排序类型
	 * @param sortName
	 *            排序字段
	 * @return List<User> 用户分页列表
	 */
	public List<User> getUserPage(int page, int pageSize, String sortType, String sortName)
	{
		Session session = SessionManager.getInstance();
		SqlParams<User> sqlParams = new SqlParams<User>();
		sqlParams.setObjectClass(User.class);
		// 设置分页的查询索引
		int firstPageIndex = (page - 1) * pageSize;
		int maxPageIndex = page * pageSize;
		sqlParams.setFirstResult(firstPageIndex);
		sqlParams.setMaxResults(maxPageIndex);

		// 添加排序类型和字段
		sqlParams.addOrder(sortType.equals("asc") ? Order.asc(sortName) : Order.desc(sortName));
		// 添加了排序类型和字段必须设置SQL语句，否则异常提示不能获取到Query对象
		sqlParams.setSql(" select * from t_user ");

		List<User> users = session.list(sqlParams);
		return users;
	}

	/**
	 * 内置分页数据对象
	 * 
	 * @param page
	 *            分页索引
	 * @param pageSize
	 *            显示条数
	 * @param totalCount
	 *            查询总数
	 * @param users
	 *            查询结果集
	 * @return Page<User> 分页数据对象
	 */
	public Page<User> getPage(int page, int pageSize, int totalCount, List<User> users)
	{
		Page<User> pageData = new Page<User>();
		pageData.setPageNo(page);
		pageData.setPageSize(pageSize);
		pageData.setTotalCount(totalCount);
		pageData.setResult(users);
		return pageData;
	}

}
